package com.bailong.aop.demo02;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类
 */
public class DynamicProxy implements InvocationHandler {
    //被代理者的对象
    private Object factory;

    /**
     * 创建代理者对象
     * @param factory 被代理者对象
     * @return 代理者对象
     */
    public Object createProxy(Object factory){
        //传入被代理者对象，方便invok方法中调用
        this.factory = factory;
        //动态生成代理者对象,参数1是类加载器，为了加载被代理对象的类；参数2是对象实现的接口数组；参数3是invocationHanndle的实现对象
       return Proxy.newProxyInstance(factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(),this);

    }
    /**
     * 实现代理功能扩展
     * @param proxy  代理对象
     * @param method 被代理者需要调用的方法
     * @param args  调用方法需要的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("给产品打广告");
        method.invoke(factory,args);
        System.out.println("给产品做售后");
        return null;
    }
}
